package com.briup.pts.service.impl;


import com.briup.pts.config.auth.TokenMap;
import com.briup.pts.config.response.ResultCode;
import com.briup.pts.domain.bean.Account;
import com.briup.pts.domain.dto.LoginUser;
import com.briup.pts.mapper.AccountMapper;
import com.briup.pts.service.AccountService;
import com.briup.pts.util.AssertUtil;
import com.briup.pts.util.JwtUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author 25095
 * @description
 * @data 2024/11/25-10:03
 */
@Service
@RequiredArgsConstructor
public class AccountServiceImpl implements AccountService {
    private final AccountMapper mapper;

    @Value("${jwt.header}")
    private String header;

    @Override
    public Map<String, String> login(LoginUser user) {
        // 根据用户名查询用户是否存在
        Account account = mapper.findByUsername(user.getUsername());
        AssertUtil.requiredNotNull(account, ResultCode.USER_NOT_EXIST);

        // 如果用户存在，继续比较密码是否一致
        String password = user.getPassword();
        AssertUtil.isTrue(password.equals(account.getPassword()),
                ResultCode.PASSWORD_IS_INVALID);

        // 如果密码相同，查看用户状态是否可用
        AssertUtil.isTrue(1 == account.getStatus(),
                ResultCode.USER_IS_UNABLE);

        // 如果用户状态为可用，那么给该用户生成登录成功的凭证
        /*
        凭证需要具备哪些功能/优势?
            1. 安全，防篡改，如果凭证被篡改了，能够及时被校验出来
            2. 安全，不易被破解
            3. 需要能够保存用户部分数据，用于标识是哪个用户的凭证
            4. 凭证需要具备过期失效的特征
            5. 易于在前后端中传输
        同时满足以上特征，可用使用 JWT（json web token）
        */
        // 填入用户名和用户id
        Map<String, Object> claims = Map.of("username", account.getUsername(),
                "id", account.getAccountId());
        String token = JwtUtil.sign(claims);

        TokenMap.setToken(account.getUsername(),token);

        // 返回token
        return Map.of(header, token);
    }
}
